package com.example.demo.algorithm;

import java.util.Arrays;

/**
 * 项目名称：hello-6
 * 类 名 称：MaoPaoSort
 * 类 描 述：冒泡排序是稳定的排序
 * 创建时间：2020/11/4 21:01
 * 创 建 人：wangsheng
 */
public class MaoPaoSort {

    public static void main(String[] args) {
        int[] array = {5, 9, 7, 4, 1, 3, 2, 8};
        //int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9};
        //bubble(array);
        bubble_v2(array);
        System.out.println("最终排序结果：" + Arrays.toString(array));

    }

    // 冒泡排序普通优化版本
    public static void bubble(int[] array) {
        //外层趟数
        for (int i = 0; i < array.length - 1; i++) {
            // 如果不冒泡则证明已经排序成功了，则中断
            boolean swapped = false;
            //交换 内层控制每一趟循环多少次,-i 优化，因为后边已经有序
            for (int j = 0; j < array.length - 1 - i; j++) {
                int temp = 0;
                if (array[j] > array[j + 1]) {
                    swap(array, j, j + 1);
                    swapped = true;
                }
                System.out.println("第-" + (i + 1) + "-趟，第--" + (j + 1) + "--次" + Arrays.toString(array));
            }
            if (!swapped) {
                break;
            }
            System.out.println("----------------------------------");
        }
    }

    // 冒泡排序进阶
    public static void bubble_v2(int[] array) {
        int n = array.length - 1;
        while (true) {
            // last 纪录最后交换前的位置，下次循环便从last开始
            int last = 0;
            for (int i = 0; i < n; i++) {
                System.out.println("比较次数：" + i);
                if (array[i] > array[i + 1]) {
                    swap(array, i, i + 1);
                    last = i;
                }
            }
            n = last;
            System.out.println(Arrays.toString(array));
            // n 为0时，则证明已经交换完了，结束循环
            if (n == 0) {
                break;
            }
        }
    }

    public static void swap(int[] array, int i, int j) {
        int temp = 0;
        temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
}
